const { ipcMain } = require('electron');
const { autoUpdater } = require('electron-updater');
const request = require('request');
const YAML = require('yamljs');
const packageData = require('../package.json');

// download/lifaweb/ 放64和32位一起的安装包
// download/lifaweb32/ 只是放32位的安装包

let getDownloadUrl;
let updateUrl; // 从render进程传过来一个去端口号的baseUrl
// 更新的资源会放到服务器${baseUrl}/download/lifaweb/的目录下

// 检查服务器是否有新版本要更新
ipcMain.on("checkNewVersion", (event, baseUrl) => {
    const url = getDownloadUrl(baseUrl);
    console.log('检查服务器是否有新版本要更新', url);
    if (!updateUrl) {
        updateUrl = url;
        autoUpdater.setFeedURL(url); // 设置autoUpdater的检查更新路径
    }

    const ymlUrl = `${url}latest.yml`;
    const currentVersion = packageData.version;
    request(ymlUrl, function (error, response, body) {
        const callbackData = { packageData, updateUrl: url, ymlUrl, currentVersion };
        if (!error && response.statusCode === 200) {
            try {
                const data = YAML.parse(body);
                const serviceVersion = data.version;
                callbackData.serviceVersion = serviceVersion;
                // 比较版本号
                const arr = [currentVersion, serviceVersion];
                arr.sort((a, b) => (a > b ? -1 : 1));
                const hasNewVersion = arr[0] === serviceVersion && currentVersion !== serviceVersion;

                if (hasNewVersion) callbackData.status = 2;
                else callbackData.status = 1;
            } catch (error) {
                callbackData.status = 0;
            }
        } else {
            callbackData.status = 0;
        }
        event.sender.send('checkNewVersionCallback', callbackData);
    });
});

// 调用autoUpdater的检查更新api
ipcMain.on("checkForUpdate", () => {
    autoUpdater.checkForUpdates();
});


// 检测更新，在你想要检查更新的时候执行，renderer事件触发后的操作自行编写
function updateHandle(mainWindow, getDownloadUrlFun) {
    getDownloadUrl = getDownloadUrlFun;
    // 通用发送方法
    function sendUpdateMessage(msg) {
        mainWindow.webContents.send('message', msg);
    }

    const message = {
        error: '检查更新出错',
        checking: '正在检查更新……',
        updateAva: '检测到新版本，正在下载……',
        updateNotAva: '现在使用的就是最新版本，不用更新',
        downloaded: '最新版本已下载，是否要重启程序更新？'
    };

    // 默认为true，检查到新版本就立马下载，设置为false搭配downloadUpdate()方法可以实现检查更新，然后再确认下载，一开始没发现所以自己写了接口
    // autoUpdater.autoDownload = false

    autoUpdater.on('checking-for-update', function () {
        sendUpdateMessage({ text: message.checking, info: { code: 'checking...' } });
    });
    autoUpdater.on('update-available', function (info) {
        sendUpdateMessage({ text: message.updateAva, info });
    });
    autoUpdater.on('update-not-available', function (info) {
        sendUpdateMessage({ text: message.updateNotAva, info });
    });
    autoUpdater.on('error', function (error) {
        sendUpdateMessage({ text: message.error, error });
    });

    // 更新下载进度事件
    autoUpdater.on('download-progress', function (progressObj) {
        mainWindow.webContents.send('downloadProgress', progressObj)
    });

    autoUpdater.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) {
        sendUpdateMessage({ downloaded: true, text: message.downloaded, info: { code: 'update-downloaded', releaseNotes, releaseName, releaseDate, updateUrl } });
        // 3秒后开始重启更新
        setTimeout(() => {
            global.store.set({ dateStr: '' });
            global.store.set({ token: false });
            global.isAllowLogin = false;
            global.canClose = true;
            autoUpdater.quitAndInstall();
        }, 3000);
    });

}

module.exports = { updateHandle };